/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.beans;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.colegiatura.bc.ColegiadoDelegate;
import org.cip.esymons.colegiatura.bc.PaisDelegate;
import org.cip.esymons.colegiatura.bc.PersonaNaturalDelegate;
import org.cip.esymons.colegiatura.bc.ReconocimientoColegiadoDelegate;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.Reconocimiento;
import org.cip.esymons.colegiatura.be.ReconocimientoColegiado;
import org.cip.esymons.colegiatura.be.TipoColegiado;
import org.cip.esymons.general.be.Pais;
import org.cip.esymons.general.be.PersonaNatural;

/**
 *
 * @author WILLIAM GASTAÑUEDI CABALLERO
 */
public class ReconocimientoColegiadoController {
//DECLARACION DE VARIABLES
    private ReconocimientoColegiadoDelegate delegadoRecoColegiado;
    private ColegiadoDelegate delegadoColegiado;
    private PersonaNaturalDelegate delegadoPersona;
    private PaisDelegate delegadoPais;
    private ReconocimientoColegiado recoColegiado;
    private busqColXCip.Colegiado colegiadoWS;
    private Colegiado colegiado;
    private PersonaNatural perNatural;
    private Pais pais;
    private TipoColegiado tipoColegiado;
    private Reconocimiento reconocimiento;
    private String numeroCIP;
    private Integer cip;
    private Integer otroColegiado;
    private Boolean bandera,activo;
    List<ReconocimientoColegiado> listaColegiadosReconocidos;
    private Date fecha1,fecha2;
    private Integer opcion;
    private Integer cantidad;

//CONSTRUCTOR.
    public ReconocimientoColegiadoController() {

        delegadoColegiado = new ColegiadoDelegate();
        delegadoRecoColegiado = new ReconocimientoColegiadoDelegate();
        delegadoPersona = new PersonaNaturalDelegate();
        delegadoPais = new PaisDelegate();
        recoColegiado = new ReconocimientoColegiado();
        colegiadoWS = new busqColXCip.Colegiado();
        colegiado = new Colegiado();
        perNatural = new PersonaNatural();
        pais = new Pais();
        tipoColegiado = new TipoColegiado();
        reconocimiento = new Reconocimiento();
        bandera = false;
        activo = false;

        listaColegiadosReconocidos = new ArrayList<ReconocimientoColegiado>();
    }

//GETTERS AND SETTERS.
    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }

    public Integer getOpcion() {
        return opcion;
    }

    public void setOpcion(Integer opcion) {
        this.opcion = opcion;
    }

    public Date getFecha1() {
        return fecha1;
    }

    public void setFecha1(Date fecha1) {
        this.fecha1 = fecha1;
    }

    public Date getFecha2() {
        return fecha2;
    }

    public void setFecha2(Date fecha2) {
        this.fecha2 = fecha2;
    }

    public List<ReconocimientoColegiado> getListaColegiadosReconocidos() {
        return listaColegiadosReconocidos;
    }

    public void setListaColegiadosReconocidos(List<ReconocimientoColegiado> listaColegiadosReconocidos) {
        this.listaColegiadosReconocidos = listaColegiadosReconocidos;
    }

    public Reconocimiento getReconocimiento() {
        return reconocimiento;
    }

    public void setReconocimiento(Reconocimiento reconocimiento) {
        this.reconocimiento = reconocimiento;
    }

    public PaisDelegate getDelegadoPais() {
        return delegadoPais;
    }

    public void setDelegadoPais(PaisDelegate delegadoPais) {
        this.delegadoPais = delegadoPais;
    }

    public PersonaNaturalDelegate getDelegadoPersona() {
        return delegadoPersona;
    }

    public void setDelegadoPersona(PersonaNaturalDelegate delegadoPersona) {
        this.delegadoPersona = delegadoPersona;
    }

    public Pais getPais() {
        return pais;
    }

    public void setPais(Pais pais) {
        this.pais = pais;
    }

    public TipoColegiado getTipoColegiado() {
        return tipoColegiado;
    }

    public void setTipoColegiado(TipoColegiado tipoColegiado) {
        this.tipoColegiado = tipoColegiado;
    }

    public Boolean getBandera() {
        return bandera;
    }

    public void setBandera(Boolean bandera) {
        this.bandera = bandera;
    }

    public Integer getOtroColegiado() {
        return otroColegiado;
    }

    public void setOtroColegiado(Integer otroColegiado) {
        this.otroColegiado = otroColegiado;
    }

    public Integer getCip() {
        return cip;
    }

    public void setCip(Integer cip) {
        this.cip = cip;
    }

    public busqColXCip.Colegiado getColegiadoWS() {
        return colegiadoWS;
    }

    public void setColegiadoWS(busqColXCip.Colegiado colegiadoWS) {
        this.colegiadoWS = colegiadoWS;
    }

    public Colegiado getColegiado() {
        return colegiado;
    }

    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }

    public PersonaNatural getPerNatural() {
        return perNatural;
    }

    public void setPerNatural(PersonaNatural perNatural) {
        this.perNatural = perNatural;
    }

    public ColegiadoDelegate getDelegadoColegiado() {
        return delegadoColegiado;
    }

    public void setDelegadoColegiado(ColegiadoDelegate delegadoColegiado) {
        this.delegadoColegiado = delegadoColegiado;
    }

    public ReconocimientoColegiadoDelegate getDelegadoRecoColegiado() {
        return delegadoRecoColegiado;
    }

    public void setDelegadoRecoColegiado(ReconocimientoColegiadoDelegate delegadoRecoColegiado) {
        this.delegadoRecoColegiado = delegadoRecoColegiado;
    }

    public String getNumeroCIP() {
        return numeroCIP;
    }

    public void setNumeroCIP(String numeroCIP) {
        this.numeroCIP = numeroCIP;
    }

    public ReconocimientoColegiado getRecoColegiado() {
        return recoColegiado;
    }

    public void setRecoColegiado(ReconocimientoColegiado recoColegiado) {
        this.recoColegiado = recoColegiado;
    }
//INICIALIZA LAS CLASES PARA UN NUEVO REGISTRO.
    public String nuevo(){
        recoColegiado = new ReconocimientoColegiado();
        reconocimiento = new Reconocimiento();
        return "nuevo";
    }
//METODO QUE PERMITE ALMACENAR LOS DATOS DE UN COLEGIADO QUE HA RECIBIDO UN
//RECONOCIMIENTO.
    public String guardar(){

       try{
            recoColegiado.setColCodigo(colegiado);
            recoColegiado.setRcofechaRegistro(new Date());
            delegadoRecoColegiado.create(recoColegiado);
            recoColegiado = new ReconocimientoColegiado();
            reconocimiento = new Reconocimiento();
            colegiado = new Colegiado();
            bandera = false;
            mostrarMensaje("INFO: ", "Se registro satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return null;
       }catch(Exception ex){
           mostrarMensaje("WARNING: ", "Se produjo un error al registrar...", FacesMessage.SEVERITY_WARN);
           return null;
       }
    }
//METODO QUE PERMITE REGISTRAR A UN COLEGIADO EXTERNO QUE NO ESTE EN EL SISTEMA
//ASI COMO LOS RECONOCIMIENTOS QUE RECIBA.
    public String guardaOtroColegiado(){

        try{
            //CREAMOS LA PERSONA.
            perNatural.setPerActivo(true);
            perNatural.setPerfechaRegistro(new Date());
            perNatural.setPertieneImagen(false);
            perNatural.setPerTipo(1);
            delegadoPersona.create(perNatural);

            //CREAMOS EN COLEGIADO.
            colegiado.setPersonaNatural(perNatural);
            colegiado.setColCondicion(true);
            colegiado.setColestaVivo(true);
            pais = delegadoPais.buscaPeru();
            colegiado.setPais(pais);
            tipoColegiado.setTcoCodigo(2);
            colegiado.setTipoColegiado(tipoColegiado);
            delegadoColegiado.create(colegiado);

            //GUARDAMOS EL RECONOCIMIENTO AL COLEGIADO.
            recoColegiado.setColCodigo(colegiado);
            recoColegiado.setRcofechaRegistro(new Date());
            delegadoRecoColegiado.create(recoColegiado);

            recoColegiado = new ReconocimientoColegiado();
            colegiado = new Colegiado();
            perNatural = new PersonaNatural();
            colegiadoWS = new busqColXCip.Colegiado();
            reconocimiento = new Reconocimiento();
            cip = 0;
            bandera = false;

            mostrarMensaje("INFO: ", "Se registro satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return null;
        }catch(Exception ex){
            mostrarMensaje("WARNING: ", "Se produjo un error al registrar...", FacesMessage.SEVERITY_ERROR);
            return null;
        }
    }
//METODO QUE REDIRECCIONA AL FORMULARIO DE EDICION DE RECONOCIMIENTOS.
    public String editar(){

        return "editar";
    }
//METODO QUE INICIALIZA LAS CLASES Y REDIRECCIONA AL FORMULARIO DE LISTADO
//DE COLEGIADOS CON RECONOCIMIENTOS.
    public String listar(){

        colegiadoWS = new busqColXCip.Colegiado();
        colegiado = new Colegiado();
        perNatural = new PersonaNatural();
        pais = new Pais();
        tipoColegiado = new TipoColegiado();
        return "listar";
    }
//METODO QUE PERMITE ACTUALIZAR LA INFORMACION INGRESADA DE ALGUN COLEGIADO
//CON RECONOCIMIENTO.
    public String actualizar(){

        try {
            delegadoRecoColegiado.edit(recoColegiado);
            recoColegiado = new ReconocimientoColegiado();
            mostrarMensaje("INFO: ", "Actualización registrada satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return "listar";
        } catch (Exception ex) {
            mostrarMensaje("WARNING: ", "Se produjo un error al actualizar...", FacesMessage.SEVERITY_ERROR);
            return null;
        }
    }
//METODO QUE PERMITE REMOVER UN REGISTRO DE RECONOCIMIENTO A ALGUN COLEGIADO.
    public String remover(){

        try {
            delegadoRecoColegiado.remove(recoColegiado);
            recoColegiado = new ReconocimientoColegiado();
        } catch (Exception ex) {
            mostrarMensaje("WARNING: ", "Se produjo un error al remover registro...", FacesMessage.SEVERITY_ERROR);
            return null;
        }
        
        return null;
    }
//METODO QUE LISTA TODOS LOS COLEGIADOS QUE HA RECIBIDO UN RECONOCIMIENTO.
    public List<ReconocimientoColegiado> getListaRecoColegiado(){

        return delegadoRecoColegiado.findAll();
    }
//METODO QUE PERMITE BUSCAR UN COLEGIADO EN EL CONSEJO NACIONAL MEDIANTE
//WEB SERVICES,Y SETEARLO EN LA CLASE PERSONA.
    public String buscarColegiadoWS() throws ParseException{

        try {
            colegiadoWS = delegadoColegiado.buscarColegiadoWS(cip);

            perNatural.setPerNombres(colegiadoWS.getWs_Nomb());
            perNatural.setPerapellidoPaterno(colegiadoWS.getWs_apePat());
            perNatural.setPerapellidoMaterno(colegiadoWS.getWs_apeMat());

            String fechaNac = colegiadoWS.getWs_fech_nac();
            SimpleDateFormat sdfn= new SimpleDateFormat("yyyy-MM-dd");
            Date dateNac = sdfn.parse(fechaNac);

            perNatural.setPerfechaNacimiento(dateNac);
            perNatural.setPerNroDNI(colegiadoWS.getWs_dni());
            perNatural.setSolcorreocip(colegiadoWS.getWs_mail_cip());

            String fechaIncorp = colegiadoWS.getWs_fech_incorp();
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
            Date dateIncorp = sdf.parse(fechaIncorp);

            colegiado.setColfechaIncorporacion(dateIncorp);
            colegiado.setColnumeroCip(String.valueOf(cip));

        } catch (Exception ex) {
            mostrarMensaje("WARNING: ", "Se produjo un error al realizar la busqueda...", FacesMessage.SEVERITY_ERROR);
            return null;
        }
        return null;
    }
//METODO QUE PERMITE REALIZAR LA BUSQUEDA DE UN COLEGIADO POR SU NUMERO DE CIP.
    public String buscaPorCip(){
        try {

            Integer cifras = numeroCIP.length();
             if(cifras<3){
                 numeroCIP = "0000"+ numeroCIP;
             }else{
                   if(cifras<4){
                       numeroCIP = "000"+numeroCIP;
                   }else{
                       if(cifras<5){
                           numeroCIP = "00"+numeroCIP;
                       }else{
                           if(cifras<6){
                              numeroCIP = "0"+numeroCIP;
                           }
                       }
                   }
             }
            colegiado = delegadoColegiado.buscaPorCip(numeroCIP);
            bandera = true;
            numeroCIP = null;
            return null;
        } catch (Exception e) {
            return null;
        }
    }
//METODO QUE LISTA LOS COLEGIADO CON RECONOCIMIENTO POR FECHAS.
    public List<ReconocimientoColegiado> listaPorFecha(){

        listaColegiadosReconocidos = null;
        listaColegiadosReconocidos = delegadoRecoColegiado.listaPorFechas(fecha1, fecha2);
        cantidad = listaColegiadosReconocidos.size();
        return listaColegiadosReconocidos;
    }
//METODO QUE LISTA LOS COLEGIADO CON RECONOCIMIENTO POR TIPO DE RECONOCIMIENTO.
    public List<ReconocimientoColegiado> listaPorReconocimiento(){

        listaColegiadosReconocidos = null;
        listaColegiadosReconocidos = delegadoRecoColegiado.listaPorReconocimiento(reconocimiento);
        cantidad = listaColegiadosReconocidos.size();
        return listaColegiadosReconocidos;
    }
//METODO QUE LISTA TODOS LOS COLEGIADO CON RECONOCIMIENTO.
    public List<ReconocimientoColegiado> listaColegiadoConReconocimiento(){

        listaColegiadosReconocidos = null;
        listaColegiadosReconocidos = delegadoRecoColegiado.findAll();
        cantidad = listaColegiadosReconocidos.size();
        return listaColegiadosReconocidos;
    }
//METODO QUE PERMITE SELECCIONAR EL TIPO DE LISTADO QUE QUEREMOS MOSTRAR.
    public String listaReconocidos(){

        if(opcion == null){
            opcion = 3;
        }
        switch(opcion){

            case 1: listaPorFecha();
                    activo = true; break;
            case 2: listaPorReconocimiento();
                    activo = true; break;
            case 3: listaColegiadoConReconocimiento();
                    activo = true; break;
        }
        
        return null;
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

}
